/**
 * struct termios
 * {
 *     tcflag_t c_iflag;		// input mode flags
 *     tcflag_t c_oflag;		// output mode flags
 *     tcflag_t c_cflag;		// control mode flags
 *     tcflag_t c_lflag;		// local mode flags
 *     cc_t c_line;			    // line discipline
 *     cc_t c_cc[NCCS];		  // control characters
 *     speed_t c_ispeed;		// input speed
 *     speed_t c_ospeed;		// output speed
 *     #define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
 *     #define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
 * };
 * termios默认设置：
 * termios{
 * .c_iflag=27906,
 * .c_oflag=5,
 * .c_cflag=1215,
 * .c_lflag=35387,
 * .c_line=0,
 * .c_ispeed=15,
 * .c_ospeed=15,
 * .c_cc[VTIME]=0
 * .c_cc[VMIN]=1
 * }
 */

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
#include <termio.h>
#include <fcntl.h>
#include <unistd.h>
#include <memory.h>
#include <sys/select.h>

#define MY_PRINTF(fmt, ...)                 \
  do                                        \
  {                                         \
    char out[128] = "";                     \
    snprintf(out, 128, fmt, ##__VA_ARGS__); \
    write(STDOUT_FILENO, out, sizeof(out)); \
  } while (0)

char get_key1()
{
  char input_ch;
  input_ch = getchar(); // 输入字符需要回车
  return input_ch;
}

char nonblocking_input(void)
{
  char input_ch;
  struct termios newt, oldt;

  // int tty = open("/dev/tty", O_RDONLY);    // 设备输入
  int input_dev = STDIN_FILENO; // 键盘输入

  tcgetattr(input_dev, &oldt); // 获取终端termios属性
  newt = oldt;

  newt.c_lflag &= ~(ICANON | ECHO); // Set characters are not buffered(~ICANON) and do not echo(~ECHO).
  tcsetattr(input_dev, TCSANOW, &newt);

  read(input_dev, &input_ch, 1);        // 读取输入字符，不需要回车
  tcsetattr(input_dev, TCSANOW, &oldt); // 重置termios为默认值

  return input_ch;
}

int main(int argc, char *argv[])
{

  while (1)
  {
    char hello_world[15] = "hello world\n";
    char in[10];

    // printf(":%c\r\n",scanKeyboard());

    // char c = get_key1();
    // printf(">%c\n", c);
    char c = nonblocking_input();
    // char c = scanKeyboard();
    usleep(100000);

    if (c == '/')
    {
      printf("1============\n");
      fgets(in, 10, stdin);
      printf("input=%s\n", in);
    }

    switch (c)
    {
    case 119: // w or can set as case 'w':
      // 使用printf打印
      printf("$[w]"); // 这时使用printf如果不加回车无法直接打印至终端
      // printf("$[w]\n");

      // 使用write
      // write(STDOUT_FILENO, "$[w]\n", sizeof("$[w]\n")); // 使用write可以直接打印至终端
      // MY_PRINTF("$[w] %c\n", c); // 自定义打印函数
    case 87: // W case 'W':
      break;
    case 115: // s
              //  write(STDOUT_FILENO, "$[s]\n", sizeof("$[s]\n"));
    case 83:  // S
      break;
    case 97: // a
    case 67: // A
      break;
    case 100: // d
    case 68:  // D
      break;
    default:
      break;
    }
  }
}
